package com.h3c.ptability.service;

import com.h3c.ptability.bo.ElectronicSignBO;
import com.h3c.ptability.bo.GetSfsIdsBO;
import com.h3c.ptability.dto.electronicSign.callback.CallbackDTO;
import com.h3c.ptability.dto.electronicSign.callback.FinishDocUrlBean;
import com.h3c.ptability.entity.PtEsignDocTemplate;
import org.springframework.scheduling.annotation.Async;

import java.util.List;

/**
 * @author chenyifan
 * @date 2022/5/16 10:05
 * 电子签章接口
 */
public interface IElectronicSignService {

    /**
     * 获取电子签章的token
     *
     * @return token
     */
    String getElectronicToken();

    /**
     * 签署成功回调
     *
     * @param callbackDTO 回调对象
     * @throws Exception 异常
     */
    void callbackFinish(CallbackDTO callbackDTO) throws Exception;

    /**
     * 签署成功回调 v2(公司和用户签署在同一流程)
     *
     * @param callbackDTO 回调对象
     * @throws Exception 异常
     */
    void callbackFinish2(CallbackDTO callbackDTO) throws Exception;

    /**
     * 主动请求公司静默签署签名接口并更新记录
     *
     * @param template 模板
     * @param recordId 记录id
     */
    @Async("taskExecutor")
    void orgSignAndUpdateRecordInfo(PtEsignDocTemplate template, String recordId);

    /**
     * 回调请求签名接口并更新记录
     *
     * @param docUrlBean 签署流程信息对象
     */
    @Async("taskExecutor")
    void callBackOrgSignAndUpdateRecordInfo(FinishDocUrlBean docUrlBean);

    /**
     * 异步上传文件到sfs并修改recordInfo状态
     *
     * @param downloadUrl 下载地址
     * @param docFileKey  唯一值对应
     * @param isWaste     是否作废 false不是  true是
     */
    @Async("taskExecutor")
    void uploadToSfsAndUpdateRecordInfo(String downloadUrl, String docFileKey, Boolean isWaste);

    /**
     * 多线程处理并签署
     *
     * @param electronicSignBO 电子签证服务间请求流转BO
     * @param isRetry          是否重新签署
     * @return 如果有场景有异常记录的员工则返回员工id，否则返回""
     * @throws Exception 异常
     */
    String finalSignFile(ElectronicSignBO electronicSignBO, Boolean isRetry) throws Exception;

    /**
     * 拒绝签署回调处理
     *
     * @param callbackDTO 回调对象
     */
    void callbackReject(CallbackDTO callbackDTO);

    /**
     * 重新签署
     *
     * @param electronicSignBO 电子签证服务间请求流转BO
     * @throws Exception 异常
     */
    void reSignFile(ElectronicSignBO electronicSignBO) throws Exception;


    /**
     * 取消签署流程
     *
     * @param recordId 记录id
     * @param reason   签署原因
     */
    void cancelSignRecord(String recordId, String reason);

    /**
     * 催办签署
     *
     * @param recordId 记录id
     */
    void remindSignRecord(String recordId);

    /**
     * 获取签名的sfs附件
     *
     * @param getSfsIdsBO 参数对象
     * @return sfs附件
     */
    List<String> getSignSfsIds(GetSfsIdsBO getSfsIdsBO);

    /**
     * 启动公司签章
     *
     * @param recordIds 记录id
     */
    void checkAndSignOrg(List<String> recordIds);

    /**
     * 更新签署流程信息
     *
     * @param callbackDTO 回调对象
     */
    void updateProcess(CallbackDTO callbackDTO);

    /**
     * 作废电子签
     * @param recordId
     * @param reason
     * @return
     */
    String cancelESign(Long recordId, String reason);
}
